﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _20161206_TwoDimensionsArray
{
    class Program
    {
        static void Main(string[] args)
        {
            //DoTask1(4, 5);
            //PrintMonthCalendar(3, 5);
            DoTask3(5);
        }

        //Создать массив n*m
        //вывести
        //Заменить каждый последний элемент строки элемент на сумму элементов с первого до предпоследего
        //вывести
        static void DoTask1(int rowCount, int columnCount)
        {
            int[,] array = CreateFillArray(rowCount, columnCount);
            Console.WriteLine("Before:");
            PrintArray(array);
            for (int i = 0; i < array.GetLength(0); i++)
            {
                int sum = 0;
                for (int j = 0; j < array.GetLength(1) - 1; j++)
                {
                    sum += array[i, j];
                }
                array[i, array.GetLength(1) - 1] = sum;
            }
            Console.WriteLine("After:");
            PrintArray(array);
        }

        //распечатает календарь на месяц
        //использовать массив 6*7
        //нули заменять табами
        //указать номер месяца (1 - январь, 12 - декабрь) и с какого дня недели начинается месяц (1 - понедельник, 7 - воскресенье)
        static void PrintMonthCalendar(int monthNumber, int dayOfWeekOfFirstDay)
        {
            if (monthNumber < 1 || monthNumber > 12)
            {
                Console.WriteLine("Недопустимое значение параметра \"Номер месяца\".");
                return;
            }
            if (dayOfWeekOfFirstDay < 1 || dayOfWeekOfFirstDay > 7)
            {
                Console.WriteLine("Недопустимое значение параметра \"День недели первого дня месяца\".");
                return;
            }
            int[,] monthArray = new int[6, 7];
            int dayCount = 0;
            int dayCounter = 0;
            //узнаем сколько дней в месяце
            switch (monthNumber)
            {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    dayCount = 31;
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    dayCount = 30;
                    break;
                case 2: //так как неизвестно, високосный ли год, на 29 дней в феврале я забил
                    dayCount = 28;
                    break;
            }
            //заполнение массива-календаря
            //первая строка
            for (int i = dayOfWeekOfFirstDay - 1; i < monthArray.GetLength(1); i++)
            {
                monthArray[0, i] = ++dayCounter;
            }
            //середина
            for (int i = 1; i < 4; i++)
            {
                for (int j = 0; j < monthArray.GetLength(1); j++)
                {
                    monthArray[i, j] = ++dayCounter;
                }
            }
            //последняя строка
            for (int i = 0; i < monthArray.GetLength(1); i++)
            {
                if (dayCounter >= dayCount)
                    break;
                monthArray[4, i] = ++dayCounter;
            }
            //печать календаря
            for (int i = 0; i < monthArray.GetLength(0); i++)
            {
                for (int j = 0; j < monthArray.GetLength(1); j++)
                    if (monthArray[i, j] == 0)
                    {
                        Console.Write("\t");
                    }
                    else
                        Console.Write("{0} \t", monthArray[i, j]);
                Console.WriteLine();
            }
        }

        //Пользователь задает размер квадратного двухмерного массива.
        //Массив заполняется случайными числами в диапазоне от -100 до 100.
        //Найти сумму элементов расположенных на главной диагонале. (i = j)
        static void DoTask3(int arraySize)
        {
            int[,] array = CreateFillArray(arraySize, arraySize, -100, 100);
            PrintArray(array);
            int sum = 0;
            for (int i = 0; i < arraySize; i++)
                sum += array[i, i];
            Console.WriteLine("Сумма значений элементов главной диагонали: {0}", sum);
        }


        //распечатывает двумерный массив
        static void PrintArray(int[,] array)
        {
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                    Console.Write("{0} \t", array[i, j]);
                Console.WriteLine();
            }
        }

        //создает двумерный массив и заполняет его
        static int[,] CreateFillArray(int rowCount, int columnCount, int minValue = 0, int maxValue = 10)
        {
            int[,] array = new int[rowCount, columnCount];
            Random rand = new Random();
            for (int i = 0; i < rowCount; i++)
                for (int j = 0; j < columnCount; j++)
                    array[i, j] = rand.Next(minValue, maxValue + 1);
            return array;
        }
    }
}